import java.util.*;
class FindMaxForm {
  // // 连续子数组
  // public int findMaxForm(String[] strs, int m, int n) {
  //   int ans = 0;
  //   int left = 0;
  //   int zeros = 0, ones = 0;
  //   for(int right = 0; right < strs.length; right++){
  //     char[] chars = strs[right].toCharArray();
  //     for (char c : chars) {
  //         if (c == '0') {
  //             zeros++;
  //         } else {
  //             ones++;
  //         }
  //     }
  //     while(zeros > m || ones > n){
  //       char[] out = strs[left].toCharArray();
  //       for(char c : out){
  //         if(c == '0'){
  //           zeros--;
  //         }else{
  //           ones--;
  //         }
  //       }
  //       left++;
  //     }
  //     ans = Math.max(ans, right - left + 1);
  //   }

  //   return ans;

  // }

  public int findMaxForm(String[] strs, int m, int n) {
    int[][] dp = new int[m + 1][n + 1];
    for(String str : strs){
      int[] count = new int[2];
      for(char c : str.toCharArray()){
        count[c - '0']++;
      }
      for(int i = m; i >= count[0]; i--){
        for(int j = n; j >= count[1]; j--){
          dp[i][j] = Math.max(dp[i][j], dp[i - count[0]][j - count[1]] + 1);
        }
      }
    }
    return dp[m][n];
  }
  public static void main(String[] args) {
    String[] strs = {"10", "0001", "111001", "1", "0"};
    int m = 5;
    int n = 3;
    FindMaxForm obj = new FindMaxForm();
    int result = obj.findMaxForm(strs, m, n);
    System.out.println(result);
  }
}


// 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

// 请你找出并返回 strs 的最大子集的长度，该子集中 最多 有 m 个 0 和 n 个 1 。

// 如果 x 的所有元素也是 y 的元素，集合 x 是集合 y 的 子集 。

 

// 示例 1：

// 输入：strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
// 输出：4
// 解释：最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ，因此答案是 4 。
// 其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意，因为它含 4 个 1 ，大于 n 的值 3 。
// 示例 2：

// 输入：strs = ["10", "0", "1"], m = 1, n = 1
// 输出：2
// 解释：最大的子集是 {"0", "1"} ，所以答案是 2 。
 